package juc.util;

import java.util.concurrent.*;

/**
 * CyclicBarrier 可以用于多线程计算数据，最后合并计算结果的场景。
 * 特性:利用CyclicBarrier的计数器能够重置，屏障可以重复使用的特性，可以支持类似“人满发
 * 车”的场景
 * 区别:CountDownLatch的计数器只能使用一次，而CyclicBarrier的计数器可以使用reset()方法重置。
 */
public class CyclicBarrierTest {

    public static void main(String[] args) throws InterruptedException {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(5,()->{
            System.out.println("裁判:--------开始比赛---------");
        });
        ScheduledExecutorService executorService = Executors.newScheduledThreadPool(10);
        //场景1：让多个线程等待-模拟并发
        for (int i = 0; i < 20; i++) {
            final int num = i;
            executorService.execute(()->{
                try {
                    int sleepMills = ThreadLocalRandom.current().nextInt(1000);
                    Thread.sleep(sleepMills);
                    System.out.println(Thread.currentThread().getName()+","+num+",准备就绪...,"+cyclicBarrier.getNumberWaiting());
                    cyclicBarrier.await();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        }

        // 主线程等待
        executorService.shutdown();
        TimeUnit.SECONDS.sleep(5);
    }

}
